/*  Copyright (s) 2019 深圳百问网科技有限公司
 *  All rights reserved
 * 
 * 文件名称：stm32f1xx_clk.c
 * 摘要：
 *  
 * 修改历史     版本号        Author       修改内容
 *--------------------------------------------------
 * 2020.6.6      v01        百问科技      创建文件
 *--------------------------------------------------
*/

#include "stm32f1xx_hal.h"
#include "stm32f1xx_clk.h"

/**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow : 
  *            System Clock source            = PLL (HSI)
  *            SYSCLK(Hz)                     = 64000000
  *            HCLK(Hz)                       = 64000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                 = 2
  *            APB2 Prescaler                 = 1
  *            PLLMUL                         = 16
  *            Flash Latency(WS)              = 2
  * @param  None
  * @retval None
  */
void SystemClock_Config(void)
{   
	// 结构体主要是选择时钟源、设置时钟开关状态、PLL倍频
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
	// 该结构体主要是配置系统时钟、AHB、APB1、APB2的分频
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    RCC_OscInitStruct.OscillatorType    = RCC_OSCILLATORTYPE_HSI; // 设置时钟来源为内部高速时钟HSI -- 8MHz
    RCC_OscInitStruct.HSEState          = RCC_HSE_OFF; // 不使用外部高速时钟，则HSE关闭
    RCC_OscInitStruct.HSEPredivValue    = RCC_HSE_PREDIV_DIV1; // 设置HSE预分频，这里没用上HSE，默认为1分频即可
    RCC_OscInitStruct.HSIState          = RCC_HSI_ON; // 内部高速时钟HSI打开
    RCC_OscInitStruct.PLL.PLLState      = RCC_PLL_ON; // 锁相环PLL打开
	RCC_OscInitStruct.PLL.PLLSource     = RCC_PLLSOURCE_HSI_DIV2; // 选择PLL时钟源，为HSI的二分频 -- 4MHz
    RCC_OscInitStruct.PLL.PLLMUL        = RCC_PLL_MUL16; // PLL的倍频为16倍频  -- 64MHz
	// 使用“HAL_RCC_OscConfig()”函数设置RCC_OscInitStruct
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        while(1);
    }

    /** Initializes the CPU, AHB and APB busses clocks 
    */
	// 设置哪些时钟将被设置
    RCC_ClkInitStruct.ClockType         = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                         |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource      = RCC_SYSCLKSOURCE_PLLCLK; // 设置系统时钟SYSCLK的来源为PLLCLK
    RCC_ClkInitStruct.AHBCLKDivider     = RCC_SYSCLK_DIV1; // 设置HCLK时钟（AHB Clock）为1分频（不能超过最大72MHz）-- 64MHz
    RCC_ClkInitStruct.APB1CLKDivider    = RCC_HCLK_DIV2; // 设置PCLK1时钟（APB1 Clock）为2分频（不能超过最大36MHz）--32MHz
    RCC_ClkInitStruct.APB2CLKDivider    = RCC_HCLK_DIV1; // 设置PCLK2时钟（APB2 Clock）为1分频（不能超过最大72MHz）--64MHz

	// 不同的系统时钟需要设置不同的等待周期（LATENCY），这里设置为2
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
        while(1);
    }
}
